// GeneratorConfigurationDialog.java
package com.plugin.mybtaisxplus.dialog; // 包声明：定义对话框的子包路径

import com.intellij.openapi.project.Project; // 导入：IntelliJ 项目接口
import com.intellij.openapi.ui.DialogWrapper; // 导入：对话框包装器基类
import com.intellij.ui.table.JBTable; // 导入：JetBrains UI 表格组件，提供更好的 IDE 外观集成
import org.jetbrains.annotations.Nullable; // 导入：可空注解

import javax.swing.*; // 导入：Swing UI 组件包
import javax.swing.table.DefaultTableModel; // 导入：默认的表格模型
import java.awt.*; // 导入：AWT 图形组件包

/**
 * 向导第二步：配置代码生成选项，如注解、模板和文件路径。
 */
public class GeneratorConfigurationDialog extends DialogWrapper { // 类定义：生成器配置对话框，继承自 DialogWrapper

    /** 为 "上一步" 按钮定义的自定义退出代码。 */
    public static final int PREVIOUS_EXIT_CODE = DialogWrapper.NEXT_USER_EXIT_CODE; // 定义一个常量，作为点击上一步按钮时的特殊退出码

    private final GeneratorSettings settings; // 字段：用于在向导步骤间共享数据的设置对象
    private DefaultTableModel tableModel; // 字段：用于管理表格数据的模型

    // UI 组件声明
    private JRadioButton annotationNoneRadio, annotationMybatisPlus2Radio, annotationMybatisPlus3Radio, annotationJpaRadio; // 组件：注解部分的单选按钮
    private JCheckBox optionsCommentCheck, optionsActualColumnCheck, optionsModelCheck, optionsToStringCheck, optionsActualColumnAnnotationCheck, optionsLombokCheck, optionsJsr310Check; // 组件：选项部分的多选框
    private JRadioButton templateCustomSwaggerRadio, templateMybatisPlus2Radio, templateDefaultAllRadio, templateMybatisPlus3Radio, templateDefaultEmptyRadio; // 组件：模板部分的单选按钮

    /**
     * 构造函数。
     * @param project 当前项目实例。
     * @param settings 共享的设置对象，用于数据传递。
     */
    public GeneratorConfigurationDialog(Project project, GeneratorSettings settings) { // 方法签名：构造函数
        super(project); // 调用：父类构造函数
        this.settings = settings; // 赋值：将传入的设置对象保存到成员变量
        setTitle("生成选项 - 第二步"); // 设置：对话框标题
        init(); // 调用：初始化对话框
    }

    /**
     * 重写 getPreferredSize 方法以同步窗口大小。
     * DialogWrapper 在显示前会调用此方法来确定窗口的最佳尺寸。
     * 我们返回第一个对话框保存的尺寸，从而实现两个窗口大小一致。
     */
    @Override // 注解：覆盖父类方法
    public Dimension getPreferredSize() { // 方法签名：获取首选尺寸
        Dimension preferredSize = settings.getWizardPreferredSize(); // 从共享设置中获取之前保存的尺寸
        if (preferredSize != null) { // 判断：如果尺寸存在
            return preferredSize; // 返回：保存的尺寸
        }
        return super.getPreferredSize(); // 否则，返回由布局管理器计算的默认尺寸
    }

    /**
     * 创建对话框的中心面板，包含所有 UI 组件。
     */
    @Override // 注解：覆盖父类方法
    protected @Nullable JComponent createCenterPanel() { // 方法签名：创建中心面板
        JPanel panel = new JPanel(new BorderLayout(0, 15)); // 创建：一个使用边框布局的面板，并增加垂直间距

        // 主选项面板
        JPanel optionsPanel = new JPanel(); // 创建：用于存放顶部所有选项的面板
        optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.Y_AXIS)); // 设置：使用垂直箱式布局
        optionsPanel.add(createAnnotationPanel()); // 添加：注解配置面板
        optionsPanel.add(Box.createVerticalStrut(15)); // 添加：一个更大的垂直间距
        optionsPanel.add(createOptionsPanel()); // 添加：选项配置面板
        optionsPanel.add(Box.createVerticalStrut(15)); // 添加：一个更大的垂直间距
        optionsPanel.add(createTemplatePanel()); // 添加：模板配置面板

        panel.add(optionsPanel, BorderLayout.NORTH); // 添加：将主选项面板放置在顶部
        panel.add(createTablePanel(), BorderLayout.CENTER); // 添加：将文件配置表格放置在中心

        return panel; // 返回：构建完成的中心面板
    }

    // --- UI 面板创建方法 ---

    private JPanel createAnnotationPanel() { // 方法签名：创建注解面板
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 创建：一个使用左对齐流式布局的面板
        panel.setBorder(BorderFactory.createTitledBorder("注解")); // 设置：面板的带标题边框 【已改为中文】

        annotationNoneRadio = new JRadioButton("无", true); // 创建：“无”单选按钮，并默认选中
        annotationMybatisPlus2Radio = new JRadioButton("Mybatis-Plus 2"); // 创建：“Mybatis-Plus 2”单选按钮
        annotationMybatisPlus3Radio = new JRadioButton("Mybatis-Plus 3"); // 创建：“Mybatis-Plus 3”单选按钮
        annotationJpaRadio = new JRadioButton("JPA"); // 创建：“JPA”单选按钮

        ButtonGroup group = new ButtonGroup(); // 创建：一个按钮组
        group.add(annotationNoneRadio); // 添加：按钮到组
        group.add(annotationMybatisPlus2Radio);
        group.add(annotationMybatisPlus3Radio);
        group.add(annotationJpaRadio);

        panel.add(annotationNoneRadio); // 添加：组件到面板
        panel.add(annotationMybatisPlus2Radio);
        panel.add(annotationMybatisPlus3Radio);
        panel.add(annotationJpaRadio);
        return panel; // 返回：创建好的面板
    }

    private JPanel createOptionsPanel() { // 方法签名：创建选项面板
        JPanel panel = new JPanel(new GridLayout(2, 4, 10, 5)); // 创建：一个网格布局面板
        panel.setBorder(BorderFactory.createTitledBorder("选项")); // 设置：面板的带标题边框 【已改为中文】

        optionsCommentCheck = new JCheckBox("注释", true); // 创建：“注释”多选框
        optionsActualColumnCheck = new JCheckBox("实际的列"); // 创建：“实际的列”多选框
        optionsModelCheck = new JCheckBox("模型", true); // 创建：“模型”多选框
        optionsToStringCheck = new JCheckBox("toString/hashCode/equals", true); // 创建：“toString等”多选框
        optionsActualColumnAnnotationCheck = new JCheckBox("实际的列注解"); // 创建：“实际的列注解”多选框
        optionsLombokCheck = new JCheckBox("Lombok"); // 创建：“Lombok”多选框
        optionsJsr310Check = new JCheckBox("JSR310: 日期 API"); // 创建：“JSR310”多选框

        panel.add(optionsCommentCheck); // 添加：组件到面板
        panel.add(optionsToStringCheck);
        panel.add(optionsLombokCheck);
        panel.add(optionsActualColumnCheck);
        panel.add(optionsActualColumnAnnotationCheck);
        panel.add(optionsJsr310Check);
        panel.add(optionsModelCheck);
        return panel; // 返回：创建好的面板
    }

    private JPanel createTemplatePanel() { // 方法签名：创建模板面板
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 创建：一个流式布局面板
        panel.setBorder(BorderFactory.createTitledBorder("模板")); // 设置：面板的带标题边框 【已改为中文】

        templateCustomSwaggerRadio = new JRadioButton("custom-model-swagger"); // 创建单选按钮
        templateMybatisPlus2Radio = new JRadioButton("mybatis-plus2");
        templateDefaultAllRadio = new JRadioButton("default-all");
        templateMybatisPlus3Radio = new JRadioButton("mybatis-plus3", true);
        templateDefaultEmptyRadio = new JRadioButton("default-empty");

        ButtonGroup group = new ButtonGroup(); // 创建按钮组
        group.add(templateCustomSwaggerRadio);
        group.add(templateMybatisPlus2Radio);
        group.add(templateDefaultAllRadio);
        group.add(templateMybatisPlus3Radio);
        group.add(templateDefaultEmptyRadio);

        panel.add(templateCustomSwaggerRadio); // 添加组件到面板
        panel.add(templateDefaultAllRadio);
        panel.add(templateDefaultEmptyRadio);
        panel.add(templateMybatisPlus2Radio);
        panel.add(templateMybatisPlus3Radio);
        return panel; // 返回创建好的面板
    }

    private JComponent createTablePanel() { // 方法签名：创建表格面板
        String[] columnNames = {"配置名称", "模块路径", "基础路径", "包名"}; // 定义：表格的列标题 【已改为中文】
        tableModel = new DefaultTableModel(columnNames, 0); // 创建：一个默认的表格模型
        JTable table = new JBTable(tableModel); // 创建：一个JBTable实例

        // 从第一步的设置中获取信息来填充表格
        String modulePath = settings.getModulePath(); // 获取：模块路径
        String basePackage = settings.getBasePackage(); // 获取：基础包路径

        // 添加默认的文件配置行
        tableModel.addRow(new Object[]{"ServiceImpl", modulePath, "src/main/java", basePackage + ".service.impl"});
        tableModel.addRow(new Object[]{"Mapper (接口)", modulePath, "src/main/java", basePackage + ".mapper"});
        tableModel.addRow(new Object[]{"Service (接口)", modulePath, "src/main/java", basePackage + ".service"});
        tableModel.addRow(new Object[]{"Mapper (XML)", modulePath, "src/main/resources", "mapper"});

        return new JScrollPane(table); // 返回：包含表格的滚动面板
    }

    /**
     * 重写默认的南部面板，以提供 "上一步"、"完成"、"取消" 按钮。
     */
    @Override // 注解：覆盖父类方法
    protected JComponent createSouthPanel() { // 方法签名：创建南部面板
        JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); // 创建：一个右对齐的流式布局面板
        JButton previousButton = new JButton("上一步"); // 创建：“上一步”按钮
        JButton finishButton = new JButton("完成"); // 创建：“完成”按钮
        JButton cancelButton = new JButton("取消"); // 创建：“取消”按钮

        previousButton.addActionListener(e -> close(PREVIOUS_EXIT_CODE)); // 绑定事件
        finishButton.addActionListener(e -> doOKAction()); // 绑定事件
        cancelButton.addActionListener(e -> doCancelAction()); // 绑定事件

        southPanel.add(previousButton); // 添加按钮
        southPanel.add(finishButton);
        southPanel.add(cancelButton);
        return southPanel; // 返回创建好的南部面板
    }

    /**
     * 在对话框关闭前，将界面上的设置保存到共享的 settings 对象中。
     */
    @Override // 注解：覆盖父类方法
    protected void doOKAction() { // 方法签名：执行OK动作
        saveSettings(); // 调用：保存设置
        super.doOKAction(); // 调用：父类的OK动作，关闭对话框
    }

    /**
     * 将此对话框中的所有UI配置保存到共享的 settings 对象。
     */
    private void saveSettings() { // 方法签名：保存设置
        // 【完善】保存注解设置
        if (annotationNoneRadio.isSelected()) settings.setAnnotation(GeneratorSettings.ANNOTATION_NONE);
        else if (annotationMybatisPlus2Radio.isSelected()) settings.setAnnotation(GeneratorSettings.ANNOTATION_MP2);
        else if (annotationMybatisPlus3Radio.isSelected()) settings.setAnnotation(GeneratorSettings.ANNOTATION_MP3);
        else if (annotationJpaRadio.isSelected()) settings.setAnnotation(GeneratorSettings.ANNOTATION_JPA);
        // 【完善】保存选项设置
        settings.setGenerateComments(optionsCommentCheck.isSelected());
        settings.setUseActualColumnAnnotation(optionsActualColumnAnnotationCheck.isSelected());
        settings.setGenerateToString(optionsToStringCheck.isSelected());
        settings.setUseLombok(optionsLombokCheck.isSelected());
        settings.setUseJsr310(optionsJsr310Check.isSelected());
        // 【新增】保存“模板集”选择
        // 【完善】保存模板集设置
        if (templateMybatisPlus3Radio.isSelected()) settings.setTemplateSetName("mybatis-plus3");
        else if (templateDefaultAllRadio.isSelected()) settings.setTemplateSetName("default-all");
        else if (templateDefaultEmptyRadio.isSelected()) settings.setTemplateSetName("default-empty");
        else if (templateCustomSwaggerRadio.isSelected()) settings.setTemplateSetName("custom-swagger");
        // 保存表格数据
        settings.getFileConfigs().clear(); // 清空：旧的表格配置
        for (int i = 0; i < tableModel.getRowCount(); i++) { // 循环：遍历表格的每一行
            FileConfig config = new FileConfig( // 创建：一个新的文件配置对象
                    (String) tableModel.getValueAt(i, 0), // 获取：配置名
                    (String) tableModel.getValueAt(i, 1), // 获取：模块路径
                    (String) tableModel.getValueAt(i, 2), // 获取：基础路径
                    (String) tableModel.getValueAt(i, 3)  // 获取：包名
            ); // 结束创建
            settings.getFileConfigs().add(config); // 添加：配置对象到设置中
        }
    }

    /**
     * 从共享的 settings 对象加载配置，用于恢复UI状态。
     */
    private void loadSettings() { // 方法签名：加载设置
        // 如果是从上一步返回，这里可以加载之前保存的设置来恢复UI状态
        // 【完善】恢复注解设置
        String annotation = settings.getAnnotation();
        if (GeneratorSettings.ANNOTATION_NONE.equals(annotation)) annotationNoneRadio.setSelected(true);
        else if (GeneratorSettings.ANNOTATION_MP2.equals(annotation)) annotationMybatisPlus2Radio.setSelected(true);
        else if (GeneratorSettings.ANNOTATION_MP3.equals(annotation)) annotationMybatisPlus3Radio.setSelected(true);
        else if (GeneratorSettings.ANNOTATION_JPA.equals(annotation)) annotationJpaRadio.setSelected(true);

        // 【完善】恢复选项设置
        optionsCommentCheck.setSelected(settings.isGenerateComments());
        optionsActualColumnAnnotationCheck.setSelected(settings.isUseActualColumnAnnotation());
        optionsToStringCheck.setSelected(settings.isGenerateToString());
        optionsLombokCheck.setSelected(settings.isUseLombok());
        optionsJsr310Check.setSelected(settings.isUseJsr310());

        // 【完善】恢复模板集设置
        String templateSet = settings.getTemplateSetName();
        if ("mybatis-plus3".equals(templateSet)) templateMybatisPlus3Radio.setSelected(true);
        else if ("default-all".equals(templateSet)) templateDefaultAllRadio.setSelected(true);
        else if ("default-empty".equals(templateSet)) templateDefaultEmptyRadio.setSelected(true);
        else if ("custom-swagger".equals(templateSet)) templateCustomSwaggerRadio.setSelected(true);
    }
}